<template>
  <view class="w-picker-view">
 		<picker-view  class="d-picker-view" :indicator-style="itemHeight" :value="pickVal" @change="handlerChange">
			<picker-view-column class="w-picker-flex2">
				<view class="w-picker-item" v-for="(item,index) in range.fyears" :key="index">{{item}}年</view>
			</picker-view-column>
			<picker-view-column class="w-picker-flex2">
				<view class="w-picker-item" v-for="(item,index) in range.fmonths" :key="index">{{item}}月</view>
			</picker-view-column>
			<picker-view-column class="w-picker-flex2">
				<view class="w-picker-item" v-for="(item,index) in range.fdays" :key="index">{{item}}日</view>
			</picker-view-column>
			<picker-view-column class="w-picker-flex1">
				<view class="w-picker-item">-</view>
			</picker-view-column>
			<picker-view-column class="w-picker-flex2">
				<view class="w-picker-item" v-for="(item,index) in range.tyears" :key="index">{{item}}年</view>
			</picker-view-column>
			<picker-view-column class="w-picker-flex2">
				<view class="w-picker-item" v-for="(item,index) in range.tmonths" :key="index">{{item}}月</view>
			</picker-view-column>
			<picker-view-column class="w-picker-flex2">
				<view class="w-picker-item" v-for="(item,index) in range.tdays" :key="index">{{item}}日</view>
			</picker-view-column>
		</picker-view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      pickVal: [],
      range: {},
      checkObj: {},
    }
  },
  props: {
    itemHeight: {
      type: String,
      default: '44px',
    },
    value: {
      type: [String, Array],
      default() {
        return []
      },
    },
    current: {
      //是否默认选中当前日期
      type: Boolean,
      default: false,
    },
    startYear: {
      type: [String, Number],
      default: 1970,
    },
    endYear: {
      type: [String, Number],
      default: new Date().getFullYear(),
    },
  },
  watch: {
    value(val) {
      this.initData()
    },
  },
  created() {
    this.initData()
  },
  methods: {
    formatNum(n) {
      return Number(n) < 10 ? '0' + Number(n) : Number(n) + ''
    },
    checkValue(value) {
      let strReg = /^\d{4}-\d{2}-\d{2}$/,
        example = '2020-04-03'
      if (!strReg.test(value[0]) || !strReg.test(value[1])) {
        console.log(new Error('请传入与mode匹配的value值，例[' + example + ',' + example + ']'))
      }
      return strReg.test(value[0]) && strReg.test(value[1])
    },
    resetToData(fmonth, fday, tyear, tmonth) {
      let range = this.range
      let tmonths = [],
        tdays = []
      let yearFlag = tyear != range.tyears[0]
      let monthFlag = tyear != range.tyears[0] || tmonth != range.tmonths[0]
      let ttotal = new Date(tyear, tmonth, 0).getDate()
      for (let i = yearFlag ? 1 : fmonth * 1; i <= 12; i++) {
        tmonths.push(this.formatNum(i))
      }
      for (let i = monthFlag ? 1 : fday * 1; i <= ttotal; i++) {
        tdays.push(this.formatNum(i))
      }
      return {
        tmonths,
        tdays,
      }
    },
    resetData(fyear, fmonth, fday, tyear, tmonth) {
      let fyears = [],
        fmonths = [],
        fdays = [],
        tyears = [],
        tmonths = [],
        tdays = []
      let startYear = this.startYear
      let endYear = this.endYear
      let ftotal = new Date(fyear, fmonth, 0).getDate()
      let ttotal = new Date(tyear, tmonth, 0).getDate()
      for (let i = startYear * 1; i <= endYear; i++) {
        fyears.push(this.formatNum(i))
      }
      for (let i = 1; i <= 12; i++) {
        fmonths.push(this.formatNum(i))
      }
      for (let i = 1; i <= ftotal; i++) {
        fdays.push(this.formatNum(i))
      }
      for (let i = fyear * 1; i <= endYear; i++) {
        tyears.push(this.formatNum(i))
      }
      for (let i = fmonth * 1; i <= 12; i++) {
        tmonths.push(this.formatNum(i))
      }
      for (let i = fday * 1; i <= ttotal; i++) {
        tdays.push(this.formatNum(i))
      }
      return {
        fyears,
        fmonths,
        fdays,
        tyears,
        tmonths,
        tdays,
      }
    },
    getData(dVal) {
      let start = this.startYear * 1
      let end = this.endYear * 1
      let value = dVal
      let flag = this.current
      let aToday = new Date()
      let tYear,
        tMonth,
        tDay,
        tHours,
        tMinutes,
        tSeconds,
        pickVal = []
      let initstartDate = new Date(start.toString())
      let endDate = new Date(end.toString())
      if (start > end) {
        initstartDate = new Date(end.toString())
        endDate = new Date(start.toString())
      }
      let startYear = initstartDate.getFullYear()
      let startMonth = initstartDate.getMonth() + 1
      let endYear = endDate.getFullYear()
      let fyears = [],
        fmonths = [],
        fdays = [],
        tyears = [],
        tmonths = [],
        tdays = [],
        returnArr = [],
        startDVal = [],
        endDVal = []
      let curMonth = flag ? value[1] * 1 : startDVal[1] * 1 + 1
      let curMonth1 = flag ? value[5][1] * 1 : value[5] * 1 + 1
      let totalDays = new Date(value[0], value[1], 0).getDate()
      let totalDays1 = new Date(value[4], value[5], 0).getDate()
      for (let s = startYear; s <= endYear; s++) {
        fyears.push(this.formatNum(s))
      }
      for (let m = 1; m <= 12; m++) {
        fmonths.push(this.formatNum(m))
      }
      for (let d = 1; d <= totalDays; d++) {
        fdays.push(this.formatNum(d))
      }
      for (let s = value[0] * 1; s <= endYear; s++) {
        tyears.push(this.formatNum(s))
      }

      if (value[4] * 1 > value[0] * 1) {
        for (let m = 1; m <= 12; m++) {
          tmonths.push(this.formatNum(m))
        }
        for (let d = 1; d <= totalDays1; d++) {
          tdays.push(this.formatNum(d))
        }
      } else {
        for (let m = value[1] * 1; m <= 12; m++) {
          tmonths.push(this.formatNum(m))
        }
        for (let d = value[2] * 1; d <= totalDays1; d++) {
          tdays.push(this.formatNum(d))
        }
      }

      pickVal = [
        fyears.indexOf(value[0]) == -1 ? 0 : fyears.indexOf(value[0]),
        fmonths.indexOf(value[1]) == -1 ? 0 : fmonths.indexOf(value[1]),
        fdays.indexOf(value[2]) == -1 ? 0 : fdays.indexOf(value[2]),
        0,
        tyears.indexOf(value[4]) == -1 ? 0 : tyears.indexOf(value[4]),
        tmonths.indexOf(value[5]) == -1 ? 0 : tmonths.indexOf(value[5]),
        tdays.indexOf(value[6]) == -1 ? 0 : tdays.indexOf(value[6]),
      ]
      return {
        fyears,
        fmonths,
        fdays,
        tyears,
        tmonths,
        tdays,
        pickVal,
      }
    },
    getDval() {
      let value = this.value
      let fields = this.fields
      let dVal = null
      let aDate = new Date()
      let fyear = this.formatNum(aDate.getFullYear())
      let fmonth = this.formatNum(aDate.getMonth() + 1)
      let fday = this.formatNum(aDate.getDate())
      let tyear = this.formatNum(aDate.getFullYear())
      let tmonth = this.formatNum(aDate.getMonth() + 1)
      let tday = this.formatNum(aDate.getDate())
      if (value && value.length > 0) {
        let flag = this.checkValue(value)
        if (!flag) {
          dVal = [fyear, fmonth, fday, '-', tyear, tmonth, tday]
        } else {
          dVal = [...value[0].split('-'), '-', ...value[1].split('-')]
        }
      } else {
        dVal = [fyear, fmonth, fday, '-', tyear, tmonth, tday]
      }
      return dVal
    },
    initData() {
      let range = [],
        pickVal = []
      let result = '',
        full = '',
        obj = {}
      let dVal = this.getDval()
      let dateData = this.getData(dVal)
      let fyears = [],
        fmonths = [],
        fdays = [],
        tyears = [],
        tmonths = [],
        tdays = []
      let fyear, fmonth, fday, tyear, tmonth, tday
      pickVal = dateData.pickVal
      fyears = dateData.fyears
      fmonths = dateData.fmonths
      fdays = dateData.fdays
      tyears = dateData.tyears
      tmonths = dateData.tmonths
      tdays = dateData.tdays
      range = {
        fyears,
        fmonths,
        fdays,
        tyears,
        tmonths,
        tdays,
      }
      fyear = range.fyears[pickVal[0]]
      fmonth = range.fmonths[pickVal[1]]
      fday = range.fdays[pickVal[2]]
      tyear = range.tyears[pickVal[4]]
      tmonth = range.tmonths[pickVal[5]]
      tday = range.tdays[pickVal[6]]
      obj = {
        fyear,
        fmonth,
        fday,
        tyear,
        tmonth,
        tday,
      }
      result = full = `${fyear + '-' + fmonth + '-' + fday + '至' + tyear + '-' + tmonth + '-' + tday}`
      this.range = range
      this.checkObj = obj
      this.$nextTick(() => {
        this.pickVal = pickVal
      })
      this.$emit('change', {
        result: result,
        value: full,
        obj: obj,
      })
    },
    handlerChange(e) {
      let arr = [...e.detail.value]
      let result = '',
        full = '',
        obj = {}
      let year = '',
        month = '',
        day = '',
        hour = '',
        minute = '',
        second = '',
        note = [],
        province,
        city,
        area
      let checkObj = this.checkObj
      let days = [],
        months = [],
        endYears = [],
        endMonths = [],
        endDays = [],
        startDays = []
      let mode = this.mode
      let col1, col2, col3, d, a, h, m
      let xDate = new Date().getTime()
      let range = this.range
      let fyear = range.fyears[arr[0]] || range.fyears[range.fyears.length - 1]
      let fmonth = range.fmonths[arr[1]] || range.fmonths[range.fmonths.length - 1]
      let fday = range.fdays[arr[2]] || range.fdays[range.fdays.length - 1]
      let tyear = range.tyears[arr[4]] || range.tyears[range.tyears.length - 1]
      let tmonth = range.tmonths[arr[5]] || range.tmonths[range.tmonths.length - 1]
      let tday = range.tdays[arr[6]] || range.tdays[range.tdays.length - 1]
      let resetData = this.resetData(fyear, fmonth, fday, tyear, tmonth)
      if (fyear != checkObj.fyear || fmonth != checkObj.fmonth || fday != checkObj.fday) {
        arr[4] = 0
        arr[5] = 0
        arr[6] = 0
        range.tyears = resetData.tyears
        range.tmonths = resetData.tmonths
        range.tdays = resetData.tdays
        tyear = range.tyears[0]
        checkObj.tyears = range.tyears[0]
        tmonth = range.tmonths[0]
        checkObj.tmonths = range.tmonths[0]
        tday = range.tdays[0]
        checkObj.tdays = range.tdays[0]
      }
      if (fyear != checkObj.fyear || fmonth != checkObj.fmonth) {
        range.fdays = resetData.fdays
      }
      if (tyear != checkObj.tyear) {
        arr[5] = 0
        arr[6] = 0
        let toData = this.resetToData(fmonth, fday, tyear, tmonth)
        range.tmonths = toData.tmonths
        range.tdays = toData.tdays
        tmonth = range.tmonths[0]
        checkObj.tmonths = range.tmonths[0]
        tday = range.tdays[0]
        checkObj.tdays = range.tdays[0]
      }
      if (tmonth != checkObj.tmonth) {
        arr[6] = 0
        let toData = this.resetToData(fmonth, fday, tyear, tmonth)
        range.tdays = toData.tdays
        tday = range.tdays[0]
        checkObj.tdays = range.tdays[0]
      }
      result = full = `${fyear + '-' + fmonth + '-' + fday + '至' + tyear + '-' + tmonth + '-' + tday}`
      obj = {
        fyear,
        fmonth,
        fday,
        tyear,
        tmonth,
        tday,
      }
      this.checkObj = obj
      this.$nextTick(() => {
        this.pickVal = arr
      })
      this.$emit('change', {
        result: result,
        value: full,
        obj: obj,
      })
    },
  },
}
</script>

<style lang="scss">
@import './w-picker.css';
</style>
